#ifndef _LBMUNIT_H_
#define _LBMUNIT_H_

#include <vector>
#include <iostream>

#include"../../../../vedo/src/NJR/Interfaces/vector3d.h"
#include "../sMathLib/VectorX/VectorX.hpp"
#include "../../core/units.h"

#include "LBParameterReader.h"

namespace ibm
{
class CFDUnit
{

};


template<typename IntType, typename DecType>
class LBMUnit: public CFDUnit
{
private:

	olb::LBunits<DecType>* lbUnits;

	DecType _tau, _omega;
	
	IntType _Nx, _Ny, _Nz;
	
	DecType _rho_fluid;
	
	DecType _phy_mu;
	
	DecType _phy_gravity;
	
	DecType _deltaX, _deltaT;
	
	sMathLib::VectorX<DecType, 3> _L;
public:
	LBMUnit();
	
	LBMUnit(DecType tau, IntType Nx, IntType Ny, IntType Nz);
		
	LBMUnit(DecType tau, IntType domain[3], DecType rho_fluid, DecType phy_mu, DecType deltaX);
	
	LBMUnit(DecType tau, std::vector< IntType > domain, DecType rho_fluid, DecType phy_mu, DecType deltaX);
	
	LBMUnit(LBParameterReader<IntType, DecType>* lbparam);
	
///
	
	virtual DecType getTau();
	
	virtual DecType getOmega();
	
	virtual DecType getNu();
	
	virtual DecType getRe();
	
	IntType getNx();
	
	IntType getNy();
	
	IntType getNz();
	
	virtual DecType getDeltaT();
	
	virtual DecType getDeltaX();
	
	virtual DecType getResolution();
	
	virtual DecType getFluidDensity();
	
	virtual DecType getPhyNu();
	
	virtual DecType getTimeFactor();
	
	virtual DecType getLengthFactor();
	
	virtual DecType getVelocityFactor();
	
	virtual DecType getGravity();
	
	virtual DecType getGravityEffected(DecType sphere_density);
	
////

	virtual void setGravityPhy(DecType grav);
	
////
	IntType nCell(DecType L) const;
	
};

} // namespace ibm
#endif // _LBMUNIT_H_
